package com.aspire.aimini.repository;

import com.aspire.aimini.model.entity.MaterialTag;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 素材标签关联Repository接口
 *
 * @author wangguiyou
 * @date 2024-01-01
 * @description 素材标签关联数据访问层接口
 */
@Mapper
public interface MaterialTagRepository extends BaseMapper<MaterialTag> {

    /**
     * 根据素材ID查询标签ID列表
     *
     * @param materialId 素材ID
     * @return 标签ID列表
     */
    List<Long> selectTagIdsByMaterialId(@Param("materialId") Long materialId);

    /**
     * 根据标签ID查询素材ID列表
     *
     * @param tagId 标签ID
     * @return 素材ID列表
     */
    List<Long> selectMaterialIdsByTagId(@Param("tagId") Long tagId);

    /**
     * 根据素材ID删除所有关联
     *
     * @param materialId 素材ID
     * @return 删除数量
     */
    int deleteByMaterialId(@Param("materialId") Long materialId);

    /**
     * 根据标签ID删除所有关联
     *
     * @param tagId 标签ID
     * @return 删除数量
     */
    int deleteByTagId(@Param("tagId") Long tagId);

    /**
     * 删除素材的特定标签
     *
     * @param materialId 素材ID
     * @param tagId      标签ID
     * @return 删除数量
     */
    int deleteByMaterialIdAndTagId(@Param("materialId") Long materialId, @Param("tagId") Long tagId);

    /**
     * 批量添加素材标签关联
     *
     * @param materialTags 关联列表
     * @return 添加数量
     */
    int batchInsert(@Param("list") List<MaterialTag> materialTags);

    /**
     * 批量删除素材标签关联
     *
     * @param materialIds 素材ID列表
     * @return 删除数量
     */
    int batchDeleteByMaterialIds(@Param("materialIds") List<Long> materialIds);

    /**
     * 查询素材的标签详情
     *
     * @param materialId 素材ID
     * @return 标签关联列表
     */
    List<MaterialTag> selectWithTagsByMaterialId(@Param("materialId") Long materialId);

    /**
     * 查询标签的素材数量
     *
     * @param tagId 标签ID
     * @return 素材数量
     */
    Long countMaterialsByTagId(@Param("tagId") Long tagId);

    /**
     * 查询素材的标签数量
     *
     * @param materialId 素材ID
     * @return 标签数量
     */
    Long countTagsByMaterialId(@Param("materialId") Long materialId);

    /**
     * 检查素材标签关联是否存在
     *
     * @param materialId 素材ID
     * @param tagId      标签ID
     * @return 是否存在
     */
    boolean existsByMaterialIdAndTagId(@Param("materialId") Long materialId, @Param("tagId") Long tagId);

    /**
     * 根据多个标签查询素材ID列表(交集)
     *
     * @param tagIds 标签ID列表
     * @return 素材ID列表
     */
    List<Long> selectMaterialIdsByTagIdsIntersection(@Param("tagIds") List<Long> tagIds);

    /**
     * 根据多个标签查询素材ID列表(并集)
     *
     * @param tagIds 标签ID列表
     * @return 素材ID列表
     */
    List<Long> selectMaterialIdsByTagIdsUnion(@Param("tagIds") List<Long> tagIds);

    /**
     * 更新标签置信度
     *
     * @param materialId 素材ID
     * @param tagId      标签ID
     * @param confidence 置信度
     * @return 更新数量
     */
    int updateConfidence(@Param("materialId") Long materialId, @Param("tagId") Long tagId,
            @Param("confidence") Double confidence);
}